WebClient হলো Spring WebFlux-এর একটি অংশ, যা নন-ব্লকিং এবং রিঅ্যাক্টিভ প্রোগ্রামিং সমর্থন করে। এটি asynchronous request তৈরি করতে ব্যবহৃত হয়।
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
@RestController
public class WebClientAsyncController {
private final WebClient webClient;
public WebClientAsyncController(WebClient.Builder builder) {
this.webClient = builder.baseUrl("https://jsonplaceholder.typicode.com").build();
}
@GetMapping("/async-webclient")
public Mono<String> fetchAsyncData() {
return webClient.get()
.uri("/posts/1")
.retrieve()
.bodyToMono(String.class); // Asynchronous response
}
}
ব্যাখ্যা:
Mono<String>
একটি Reactive স্ট্রিম, যা ডেটা পাওয়ার পর একটি একক ভ্যালু প্রদান করে।retrieve()
মেথডটি সার্ভার থেকে ডেটা রিসিভ করে।bodyToMono(String.class)
ডেটাকে asynchronous পদ্ধতিতে প্রক্রিয়াজাত করে।RestTemplate নিজে ব্লকিং I/O-এর জন্য ডিজাইন করা, তবে Spring এর AsyncRestTemplate (যা Spring 5 থেকে Deprecated) ব্যবহার করে asynchronous request তৈরি করা সম্ভব। এর বাইরেও Java CompletableFuture ব্যবহার করে RestTemplate এর মাধ্যমে asynchronous request করা যায়।
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.concurrent.CompletableFuture;
@RestController
public class RestTemplateAsyncController {
private final RestTemplate restTemplate;
public RestTemplateAsyncController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@Async
@GetMapping("/async-resttemplate")
public CompletableFuture<String> fetchAsyncData() {
return CompletableFuture.supplyAsync(() -> {
String url = "https://jsonplaceholder.typicode.com/posts/1";
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
return response.getBody();
});
}
}
ব্যাখ্যা:
@Async
:CompletableFuture
:supplyAsync()
:ফিচার | WebClient | RestTemplate + CompletableFuture |
---|---|---|
ব্লকিং বা নন-ব্লকিং | সম্পূর্ণ নন-ব্লকিং। | মূলত ব্লকিং, তবে CompletableFuture দিয়ে নন-ব্লকিং করা যায়। |
Reactive Programming | Reactive Streams (Mono এবং Flux ) সমর্থন করে। | Reactive Programming সমর্থন করে না। |
ব্যবহার সহজতা | WebClient দিয়ে Asynchronous Request সহজ। | CompletableFuture ব্যবহারে কোড একটু বেশি জটিল। |
পারফরম্যান্স | কনকারেন্ট রিকোয়েস্টে পারফরম্যান্স অনেক ভালো। | তুলনামূলকভাবে কম। |
Spring Future | Spring WebFlux-এর অংশ। | Spring MVC-এর অংশ। |
Read more